#include "voicewindow.h"
#include "ui_voicewindow.h"
#include "functionmainwindow.h"
#include <QGraphicsColorizeEffect>
extern "C"
{
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <linux/input.h>
#include <strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

}

//枚举界面
enum Win{
    Album_win = 1,User_Message_win,Weather_win,Camera_win,Led_win,Beep_win
};

VoiceWindow::VoiceWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::VoiceWindow)
{
    ui->setupUi(this);
    show_back_gif();
}

VoiceWindow::~VoiceWindow()
{
    delete ui;
}

//获取语音并发送给服务器接受服务器的返回信息，执行相应的功能
void VoiceWindow::play_voice()
{
    //创建套接字
        int sock_fd = socket(PF_INET,SOCK_STREAM,0);
        printf("aaa\n");
        //绑定地址(IP+PORT)
        struct sockaddr_in srvaddr;
        srvaddr.sin_family = PF_INET;
        //端口
        srvaddr.sin_port = htons(55555);
        //IP地址
        srvaddr.sin_addr.s_addr = inet_addr("192.168.2.199");
        printf("002\n");
        //发起连接请求
        ::connect(sock_fd,(struct sockaddr *)&srvaddr,sizeof(srvaddr));
        printf("003\n");
        int fd = open("1.wav",O_RDWR);
        if(fd < 0)
        {
            perror("open() failed");
            return;
        }
        //获取文件总字节数
        int file_size = lseek(fd,0,SEEK_END);
        //将文件光标偏移到文件开头
        lseek(fd,0,SEEK_SET);
        send(sock_fd,&file_size,4,0);
        printf("file_size = %d\n",file_size);

        char buf[1024] = {0};
        int ret_rd;
        while(1)
        {
            bzero(buf,1024);
            ret_rd = read(fd,buf,1024);
            printf("ret_rd = %d\n",ret_rd);
            if(ret_rd == 0)	//发送完毕
            {
                printf("发送完毕\n");
                break;
            }
            send(sock_fd,buf,ret_rd,0);
            if(ret_rd < 1024)
            {
                printf("send over\n");
                break;
            }
        }
        bzero(buf,100);
        printf("等待接收数据\n");
        recv(sock_fd,buf,100,0);
//        //枚举界面
//        enum Win{
//            Album_win = 1,User_Message_win,Weather_win,Camera_win,Led_win,Beep_win
//        };
//        <dialpre>:打开!id(10001)|显示!id(10001);
//        <contact>:相册 | 监控 | 灯 | 报警器 | 用户信息 | 天气;
        if(strstr(buf,"相册") != NULL)  //匹配相册成功
        {
            //play_photo();
            printf("play photo\n");

//            //把之前父界面的隐藏状态改为显示状态，显示父界面
//            this->parentWidget()->show();
            //打开相册界面--给功能界面的相册按键发送点击信号
            voiveSignal(Album_win,this);
            this->hide();//隐藏当前界--不能关闭。一旦关闭程序跳转界面后直接结束
        }
        if(strstr(buf,"监控") != NULL)  //匹配监控成功
        {
            //play_music();
            printf("play music\n");

            voiveSignal(Camera_win,this);
        }
        if(strstr(buf,"灯") != NULL)  //匹配灯成功
        {
            //play_video();
            printf("play video\n");
            voiveSignal(Led_win,this);
        }
        if(strstr(buf,"报警器") != NULL)  //匹配报警器成功
        {
            //play_video();
            printf("play video\n");
            voiveSignal(Beep_win,this);
        }
        if(strstr(buf,"用户信息") != NULL)  //匹配报警器成功
        {
            //play_video();
            printf("play video\n");
            voiveSignal(User_Message_win,this);
        }
        if(strstr(buf,"天气") != NULL)  //匹配报警器成功
        {
            //play_video();
            printf("play video\n");
            voiveSignal(Weather_win,this);
        }
        if(strstr(buf,"没有识别结果") != NULL)
        {
            printf("没有识别结果");
        }
        //关闭套接字
        ::close(sock_fd);
        ::close(fd);
}

//显示动态背景图
void VoiceWindow::show_back_gif()
{
    QMovie *movepic = new QMovie(QString::fromLocal8Bit(":/new/prefix1/back.gif"));
    movepic->setScaledSize(ui->backGif->size());
    ui->backGif->setMovie(movepic);
    movepic->start();
}

//语音功能--点击获取语音并执行相应的功能
void VoiceWindow::on_voice_btn_clicked()
{
    printf("开始录音\n");
    system("arecord -d5 -c1 -r16000 -twav -fS16_LE 1.wav");
//    ui->voice_btn->setStyleSheet("border-image: url(:/new/prefix1/voice_start.png);");
//    // 将颜色效果应用到按钮
//    QGraphicsColorizeEffect* effect = new QGraphicsColorizeEffect(this);
//    effect->setColor(QColor(0, 255, 255)); // 天蓝色
//    effect->setStrength(1.0);
//    ui->voice_btn->setGraphicsEffect(effect);
//    qApp->processEvents(); // 强制刷新 UI
    play_voice();
//    // 录音结束关闭录音--熄灭按键
//    ui->voice_btn->setStyleSheet("border-image: url(:/new/prefix1/voice_stop.png);");
//    ui->voice_btn->setGraphicsEffect(nullptr);

}

//返回上个界面--功能界面--隐藏当前界面（该界面之创建一次）
void VoiceWindow::on_return_btn_clicked()
{
    //因为在跳转时，记录了上一个界面
    //所以可以利用此函数获取当前窗口的父窗口对象指针
    QWidget *parent = this->parentWidget();

    parent->show();//把之前父界面的隐藏状态改为显示状态，显示父界面

    this->hide();//隐藏当前界--因为语音界面之创建了一次
}
